// Copyright 2020 Espressif Systems (Shanghai) Co. Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "button_gpio.h"

static const char *TAG = "gpio button";

uint8_t button_gpio_init(const button_gpio_config_t *config)
{
//    gpio_config_t gpio_conf;
//    gpio_conf.intr_type = GPIO_INTR_DISABLE;
//    gpio_conf.mode = GPIO_MODE_INPUT;
//    gpio_conf.pin_bit_mask = (1ULL << config->gpio_num);
//    if (config->active_level) {
//        gpio_conf.pull_down_en = GPIO_PULLDOWN_ENABLE;
//        gpio_conf.pull_up_en = GPIO_PULLUP_DISABLE;
//    } else {
//        gpio_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
//        gpio_conf.pull_up_en = GPIO_PULLUP_ENABLE;
//    }
//    gpio_config(&gpio_conf);

	gpio_init_type gpio_init_struct;
	crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
	gpio_default_para_init(&gpio_init_struct);
	
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
	gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
	gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
	gpio_init_struct.gpio_pull = GPIO_PULL_UP;
	
	switch(config->gpio_num){
		// A+
		case 0:
			gpio_init_struct.gpio_pins = GPIO_PINS_10;
			gpio_init(GPIOB, &gpio_init_struct);
			break;
		// A-
		case 1:
			gpio_init_struct.gpio_pins = GPIO_PINS_2;
			gpio_init(GPIOB, &gpio_init_struct);
			break;
		// FUN
		case 2:
			gpio_init_struct.gpio_pins = GPIO_PINS_11;
			gpio_init(GPIOB, &gpio_init_struct);
			break;
		// B+
		case 3:
			gpio_init_struct.gpio_pins = GPIO_PINS_8;
			gpio_init(GPIOB, &gpio_init_struct);
			break;
		// B-
		case 4:
			gpio_init_struct.gpio_pins = GPIO_PINS_9;
			gpio_init(GPIOB, &gpio_init_struct);
			break;
	}
	
    return 0;
}

uint8_t button_gpio_deinit(int gpio_num)
{
//    /** both disable pullup and pulldown */
//    gpio_config_t gpio_conf = {
//        .intr_type = GPIO_INTR_DISABLE,
//        .mode = GPIO_MODE_INPUT,
//        .pin_bit_mask = (1ULL << gpio_num),
//        .pull_down_en = GPIO_PULLDOWN_DISABLE,
//        .pull_up_en = GPIO_PULLUP_DISABLE,
//    };
//    gpio_config(&gpio_conf);
	
    return 0;
}

uint8_t button_gpio_get_key_level(void *gpio_num)
{
	uint8_t level = 1;
	switch((uint32_t) gpio_num)
	{
		case 0:
			level = gpio_input_data_bit_read(GPIOB, GPIO_PINS_10);
			break;
		case 1:
			level = gpio_input_data_bit_read(GPIOB, GPIO_PINS_2);
			break;
		case 2:
			level = gpio_input_data_bit_read(GPIOB, GPIO_PINS_11);
			break;
		case 3:
			level = gpio_input_data_bit_read(GPIOB, GPIO_PINS_8);
			break;
		case 4:
			level = gpio_input_data_bit_read(GPIOB, GPIO_PINS_9);
			break;
	}
    return level;
}